iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

你的程式真的安全嗎?從資安的角度做 code review系列 第 11

C - insecure randoness(不安全的密碼術:隨機性不安全)

  • 分享至 

  • xImage
  •  

下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~

C - insecure randoness(不安全的密碼術:隨機性不安全)

  • 形成原因:當一些安全結構依賴於某些隨機變數值,而這個隨機變數值在某種程度上是有規律可以猜測的。
  • 後果:攻擊者可以根據計算推敲所有有使用隨機函式產生的數值,進而獲取敏感資料
  • 實例:當使用者忘記密碼時要重設密碼,系統產生一隨機值(假設寄到信箱)作為暫時密碼來讓使用者登入重設,但是這個隨機值是由某個函數計算出來的,且他並不是真的隨機,攻擊者可以觀察隨機值產生的規律,進而推敲出隨機值盜用使用者的帳號
  • 解決方法:
    • 使用加密保護的亂數產生器
    • 在使用前測試這些亂數產生器是否真的隨機

第1題

錯誤區塊

srand(input.size());
for (unsigned int i = 0; i < ARGON2_SALT_LENGTH; i++) {
    salt[i] = rand();
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:應使用Argon2Encoder中隨機生成器生成的亂數種子進行雜湊。原本的程式碼中,使用者輸入對亂數種子有直接影響,這使得生成的隨機值不太安全。

主要修正方法

把原區塊改成

CryptoPP::AutoSeededRandomPool prng;
prng.GenerateBlock(salt, ARGON2_SALT_LENGTH);
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
由經過良好測試且安全的CryptoPP庫生成隨機字元。


上一篇
C - error details (資訊曝露:錯誤詳情)
下一篇
C - sensitive data exposure (敏感性資料儲存:明文儲存資料)
系列文
你的程式真的安全嗎?從資安的角度做 code review25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言